import Vue from 'vue'
import store from './store'
import App from './App'
import glob from './static/config.js'
import uView from "uview-ui";
Vue.use(uView);
import Json from './Json' //测试用数据
/**
 *  因工具函数属于公司资产, 所以直接在Vue实例挂载几个常用的函数
 *  所有测试用数据均存放于根目录json.js
 *  
 *  css部分使用了App.vue下的全局样式和iconfont图标，有需要图标库的可以留言。
 *  示例使用了uni.scss下的变量, 除变量外已尽量移除特有语法,可直接替换为其他预处理器使用
 */
uni.$u.http.setConfig((config) => {
	/* config 为默认全局配置*/
	config.baseURL = glob.baseUrl; /* 根域名 */
	return config
})
// 请求拦截
uni.$u.http.interceptors.request.use((config) => { // 可使用async await 做异步操作
	// 初始化请求拦截器时，会执行此方法，此时data为undefined，赋予默认{}
	config.data = config.data || {}
	// 根据custom参数中配置的是否需要token，添加对应的请求头
	if (config?.custom?.auth) {
		// 可以在此通过vm引用vuex中的变量，具体值在vm.$store.state中
		config.header.token = vm.$store.state.userInfo.token
	}
	return config
}, config => { // 可使用async await 做异步操作
	return Promise.reject(config)
})

// 响应拦截
uni.$u.http.interceptors.response.use((response) => {
	/* 对响应成功做点什么 可使用async await 做异步操作*/
	const data = response.data

	// 自定义参数
	const custom = response.config?.custom
	if (data.resultCode == '000000'){
		return data.data === undefined ? {} : data.data
	}else if(data.resultCode == '200009'){
		store.commit('logout')
		uni.navigateTo({
			url: '/pages/public/login'
		})
		return data.data === undefined ? {} : data.data
	}else{
		// 如果没有显式定义custom的toast参数为false的话，默认对报错进行toast弹出提示
		if (custom.toast !== false) {
			uni.$u.toast(data.resultInfo)
		}

		// 如果需要catch返回，则进行reject
		if (custom?.catch) {
			return Promise.reject(data)
		} else {
			// 否则返回一个pending中的promise，请求不会进入catch中
			return new Promise(() => {})
		}
	}
	
}, (response) => {
	// 对响应错误做点什么 （statusCode !== 200）
	return Promise.reject(response)
})
const msg = (title, duration = 1500, mask = false, icon = 'none') => {
	//统一提示方便全局修改
	if (Boolean(title) === false) {
		return;
	}
	uni.showToast({
		title,
		duration,
		mask,
		icon
	});
}
const json = type => {
	//模拟异步请求数据
	return new Promise(resolve => {
		setTimeout(() => {
			resolve(Json[type]);
		}, 500)
	})
}

const prePage = () => {
	let pages = getCurrentPages();
	let prePage = pages[pages.length - 2];
	// #ifdef H5
	return prePage;
	// #endif
	return prePage.$vm;
}


Vue.config.productionTip = false
Vue.prototype.glob = glob
Vue.prototype.$fire = new Vue();
Vue.prototype.$store = store;
Vue.prototype.$api = {
	msg,
	json,
	prePage
};

App.mpType = 'app'

const app = new Vue({
	...App
})
app.$mount()
